// 文件名：span_io_buffer.cpp
// 目的：演示以 std::span 作为只读视图，对整块文件缓冲执行“分块处理（chunking）”而无需复制。
// 设计要点：
//   - 通过 ifstream 读取 Binary 文件到 std::vector<std::byte>（一次性载入示例）；
//   - 使用 std::as_bytes(std::span(buffer)) 获得只读字节视图 std::span<const std::byte>；
//   - 以固定 chunkSize（1024 字节）切分，first/subspan 生成子视图传入处理函数；
//   - processChunk 仅读：打印分块索引、大小、首字节。
// 性能与注意：
//   - 本示例“整文件读入内存”简单直观，但大文件可能内存占用高；实际可边读边处理或使用 mmap；
//   - std::byte 转整数输出，建议使用 std::to_integer<int>(chunk.front())（当前示例用 static_cast<int> 仅作演示）；
//   - std::span 提供零拷贝视图，不管理所有权，需保证底层 buffer 生命周期在使用期间有效。

#include <fstream>
#include <iostream>
#include <span>
#include <vector>

void processChunk(std::span<const std::byte> chunk, std::size_t chunkIndex) {
    std::cout << "Chunk " << chunkIndex << ": size = " << chunk.size() << '\n';
    if (!chunk.empty()) {
        std::cout << "  first byte = "
                  << std::hex << static_cast<int>(chunk.front()) << std::dec << '\n';
        // 更稳妥写法：std::to_integer<int>(chunk.front())
    }
}

int main() {
    std::ifstream ifs("example.bin", std::ios::binary);
    if (!ifs) {
        std::cerr << "Failed to open file.\n";
        return 1;
    }

    // 一次性读取到字节缓冲
    std::vector<std::byte> buffer(std::istreambuf_iterator<char>(ifs), {});
    std::span<const std::byte> view = std::as_bytes(std::span(buffer));

    // 固定分块大小，循环切片
    constexpr std::size_t chunkSize = 1024;
    std::size_t index = 0;
    while (!view.empty()) {
        std::size_t size = std::min(chunkSize, view.size());
        processChunk(view.first(size), index++);
        view = view.subspan(size);
    }

    return 0;
}